package com.cskaoyan._03innerclazz._06lambda._03methodreference;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/14 10:26
 **/

/*
1.静态方法引用
2.对象名引用成员方法
3.类名引用成员方法
4.构造方法引用
 */
public class Demo {
    public static void main(String[] args) {
        // 静态方法引用
        // lambda写法
        IA ia = () -> A.func1();
        ia.testA();

        IA ia1 = A::func1;
        ia1.testA();

        //IB ib = s -> System.out.println(s);
        //ib.testB("aaa");

        // 可以指向源码中的方法或者第三方工具的方法
        IB ib = System.out::println;
        ib.testB("aaa");

        // 对象名引用成员方法
        // lambda
        IC ic = a -> new C().func2(a);
        ic.testC(100);
        IC ic1 = new C()::func2;
        ic1.testC(200);


        // "abcdef", 希望对字符串进行截取"bc"
        // 主要使用String类中的成员方法
        // subString( int start,int end)  [start,end)
        //String s = "abcdef";
        //String substring = s.substring(1, 3);
        //System.out.println("substring = " + substring);

        // 类名引用成员方法
        ID id = (s, start, end) -> s.substring(start, end);
        String str = id.testD("abcdef", 1, 3);
        System.out.println("str = " + str);
        ID id2 = String::substring;
        String str2 = id2.testD("abcdef", 1, 3);
        System.out.println("str2 = " + str2);


        // 4.构造方法引用
        // lambda
        //IE ie = (a, b) -> new E(a, b);
        IE ie = (a, b) -> new E(a, b);
        ie.testE(222, 333);
        IE ie1 = E::new;
        ie1.testE(111, 222);

    }
}

@FunctionalInterface
interface IA{
    void testA();
}

class A {
    // 定义一个静态方法 作为IA接口中的testA方法的实现
    static void func1(){
        System.out.println("IA接口中的testA方法的实现");
    }
}

@FunctionalInterface
interface IB{
    void testB(String s);
}

@FunctionalInterface
interface IC{
    void testC(int a);
}

class C {
    void func2(int m){
        System.out.println(m);
    }
}

@FunctionalInterface
interface ID{
    String testD(String s, int start, int end);
}

@FunctionalInterface
interface IE{
    void testE(int a, int b);
}

class E{
    int a;
    int b;

    public E(int a, int b) {
        System.out.println(a+"----"+b);
        this.a = a;
        this.b = b;
    }
}